Don't use gammaln on complex input
authorDebian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>
Sat, 2 Mar 2019 14:59:35 +0000 (14:59 +0000)
committerRebecca N. Palmer <rebecca_palmer@zoho.com>
Sat, 2 Mar 2019 14:59:35 +0000 (14:59 +0000)
In scipy >= 1.0, it rejects such input with
TypeError: ufunc 'gammaln' not supported for the input types, and the
inputs could not be safely coerced to any supported types according
to the casting rule ''safe''

Author: Kevin "bashtage" Sheppard, Rebecca N. Palmer <rebecca_palmer@zoho.com>
Origin: upstream https://github.com/statsmodels/statsmodels/pull/3964/commits/c11c6242ff81a0f83d3e7fd83a8105397d3cbc1d
Forwarded: not-needed

Gbp-Pq: Name gammaln_complex.patch

statsmodels/discrete/discrete_model.py

index db29bfb0d2c206fda81189b3bc6bea62d3a6a599..6504a8b4613679e4131d09bb81be90e831243f09 100644 (file)
@@ -22,6 +22,10 @@ __all__ = ["Poisson", "Logit", "Probit", "MNLogit", "NegativeBinomial"]
 from statsmodels.compat.python import lmap, lzip, range
 import numpy as np
 from scipy.special import gammaln
+try:
+    from scipy.special import loggamma
+except ImportError:
+    loggamma = gammaln
 from scipy import stats, special, optimize  # opt just for nbin
 import statsmodels.tools.tools as tools
 from statsmodels.tools import data as data_tools
@@ -2004,12 +2008,16 @@ class NegativeBinomial(CountModel):
         self._initialize()
 
     def _ll_nbin(self, params, alpha, Q=0):
+        if np.any(np.iscomplex(params)) or np.iscomplex(alpha):
+            gamma_ln = loggamma
+        else:
+            gamma_ln = gammaln
         endog = self.endog
         mu = self.predict(params)
         size = 1/alpha * mu**Q
         prob = size/(size+mu)
-        coeff = (gammaln(size+endog) - gammaln(endog+1) -
-                 gammaln(size))
+        coeff = (gamma_ln(size+endog) - gamma_ln(endog+1) -
+                 gamma_ln(size))
         llf = coeff + size*np.log(prob) + endog*np.log(1-prob)
         return llf